-- Smooth Trail script by ffoxD.
-- Reusable, use with credit.
local function SmoothTrail(mo, trailmo, freq)
    -- Real Z momentum thingy plus leveltime checks.
    -- You can replace all this with mo.momz+mo.pmomz but that stays at 0 when on slopes and on ground.
    if not mo.prevz or not mo.prevleveltime or (mo.prevleveltime ~= leveltime - 1) then
       mo.prevz = mo.z
    end
    local rmomz = mo.z - mo.prevz
    mo.prevz = mo.z
    mo.prevleveltime = leveltime
    -- Handy local variables.
    local mospeed = R_PointToDist2(0, 0, R_PointToDist2(0, 0, mo.momx, mo.momy), rmomz)
    local dist = (mospeed/freq)
    -- The loop, repeats until it spawns all the thok objects.
    for i = dist, 1, -1 do
        local spawnedmo = P_SpawnMobjFromMobj(mo, (mo.momx/dist)*i, (mo.momy/dist)*i, (rmomz/dist)*i, trailmo)
        spawnedmo.color = mo.color
        spawnedmo.blendmode = AST_ADD -- blend
    end
end
-- Usage example.
addHook("PlayerThink", function(player)
	 if player.mo.skin == "sonic"
    and player.pflags & PF_SPINNING
	 or (player.pflags & PF_THOKKED)
	 and player.mo.skin == "sonic" then
        if skins[player.mo.skin].spinitem == -1 then
            SmoothTrail(player.mo, MT_THOK, 4*FRACUNIT)
        else
            SmoothTrail(player.mo, skins[player.mo.skin].spinitem, 4*FRACUNIT)
        end
    end
end)

//Weak Homing from BuggieTheBug
addHook("PlayerThink", function(player)
	if player.mo.skin == "sonic"
	and player.pflags & PF_JUMPED
		player.target = P_LookForEnemies(player, true, true)
		if player.target
		and player.pflags & PF_JUMPED
			P_SpawnLockOn(player, player.target, S_LOCKON1)
		end
	end	
end)


addHook("AbilitySpecial", function(player)
	if player.mo.skin == "sonic"
		player.target = P_LookForEnemies(player, true, true)
		if not P_IsObjectOnGround(player.mo)
			if player.target
				P_HomingAttack(player.mo, player.target)
				P_SpawnThokMobj(player)
				S_StartSound(player.mo, sfx_zoom)
				player.mo.state = S_PLAY_ROLL
				player.pflags = $1 & ~PF_THOKKED
			end
			if not player.target 
			and not (player.pflags & PF_THOKKED)
				P_Thrust(player.mo, player.mo.angle, 30*FRACUNIT)
				P_SetObjectMomZ(player.mo, 7*FRACUNIT)
				P_SpawnThokMobj(player)
				S_StartSound(player.mo, sfx_thok)
				player.mo.state = S_PLAY_ROLL
				player.pflags = $|PF_THOKKED
			end	
		end
	end	
end)	